home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / misc / emu / Apex-src.lha / QUMEHANA.68K < prev    next >
Text File  |  2001-09-30  |  19KB  |  579 lines

  1. ;QUMEHANA.68K    JAN-16-87    (ALSO SEE "INFOSTR")
  2. ;Console handler for Qume QVT-101 terminal
  3. ;Written by Loren Blaney
  4. ;This is based on 6502 code written by P.J.R. Boyle.
  5. ;
  6. ;REVISION HISTORY:
  7. ;MAR-15-86, Original, written for DFM Engineering
  8. ;MAY-22-86, Converted to ASM68K conventions
  9. ;SEP-15-86, Modified
  10. ;NOV-26-86, Output device 1 is second terminal plugged into port 1.
  11. ; Input device 1 is still the unbuffered keyboard on the first terminal.
  12. ;DEC-11-86, Fix device 1 cursor to appear on the first terminal, etc.
  13. ;FEB-16-87, Modified for Amiga, converted to a single Qume QVT-101.
  14. ;
  15. ;NOTES:
  16. ;This console handler is still lacking CHKUSR. It differs from the Apple
  17. ; handler in that a <CR> does not erase the rest of the line, control
  18. ; characters are not echoed to the screen (because of Wyse - not me),
  19. ; null characters are ignored, the cursor pins at the limits rather than
  20. ; wraps around, tabs are not deleted correctly when using the "<--" key,
  21. ; CURSORX and CURSORY are not correct for lines greater than 80
  22. ; characters. This handler does not the have the <ESC> cursor commands
  23. ; of the Apple, but it does have a cleaner line delete (CTRL-X) and it
  24. ; has an undelete command (CTRL-Z).
  25.  
  26.     NOLIST
  27.     INCLUDE    SYSPAG        ;GET THE SYSTEM DEFINITIONS
  28.     LIST
  29.  
  30.     ORG    MEMTOP -$1700
  31. START    EQU    @        ;ADDRESS WHERE THIS HANDLER STARTS
  32.  
  33. ;======================================================================
  34. ;BUFFERED CONSOLE HANDLER (DEVICE #0)
  35. ;
  36. CONHAN0    DC.L    OPENI0        ;0 = OPENI
  37.     DC.L    OPENO0        ;1 = OPENO
  38.     DC.L    CHIN0        ;2 = CHIN
  39.     DC.L    CHOUT0        ;3 = CHOUT
  40.     DC.L    CLOSE0        ;4 = CLOSE
  41.     DC.L    GETINFO        ;5 = GETINFO
  42.     DC.L    DUMMY        ;6 = SPARE
  43.     DC.L    CURSOR1        ;7 = POSITION CURSOR OF CURRENT DEVICE
  44.     DC.L    DUMMY        ;8
  45.     DC.L    DUMMY        ;9
  46.     DC.L    DUMMY        ;10
  47.     DC.L    SHOCUR        ;11 = TURNS THE CURSOR ON/OFF FOR DEVICE
  48.     DC.L    BUTES        ;12 = SET DISPLAY ATTRIBUTES FOR DEVICE
  49.  
  50. ;----------------------------------------------------------------------
  51. ;OPEN (INITIALIZE) THE BUFFERED KEYBOARD FOR INPUT.
  52. ; THIS WILL DISCARD ANY CHARACTERS IN THE BUFFER AND ANY PENDING
  53. ;  CHARACTERS FROM THE KEYBOARD.
  54. ;
  55. OPENI0    MOVE.L    #LINBUF,LINPTRF    ;RESET LINE BUFFER FILL & EMPTY POINTERS
  56.     MOVE.L    #LINBUF,LINPTRE
  57.     BRA    OPENI1        ;(PBRA) ALSO OPEN UNBUFFERED KEYBOARD
  58.  
  59. ;----------------------------------------------------------------------
  60. ;OPEN (INITIALIZE) BUFFERED TERMINAL FOR OUTPUT
  61. ;
  62. OPENO0    BSR    OPEN
  63.     BRA    CRLF1        ;(PBRA)
  64.  
  65. ;----------------------------------------------------------------------
  66. ;GET A CHARACTER FROM THE BUFFERED KEYBOARD AND RETURN IT IN D0.
  67. ;THE BUFFERED KEYBOARD HANDLES THE FOLLOWING CONTROL CHARACTERS:
  68. ; <-- (CTRL-H):    DELETE BACK ONE CHARACTER
  69. ; --> (CTRL-U): MOVE CURSOR FORWARD ONE CHARACTER
  70. ; DEL:        DELETE BACK ONE CHARACTER (SAME AS CTRL-H)
  71. ; CTRL-X:    DELETE THE ENTIRE LINE
  72. ; CTRL-Z:    UNDELETE THE LINE
  73. ; WARNING: THE "<--" AND "DEL" KEYS WILL NOT HANDLE TABS CORRECTLY.
  74. ;
  75. CHIN0    MOVEM.L    A0/A1,-(SP)    ;SAVE REGISTERS
  76.     MOVEA.L    LINPTRF,A0    ;GET THE LINE BUFFER POINTERS
  77.     MOVEA.L    LINPTRE,A1
  78.  
  79.     CMPA.L    A0,A1        ;DOES FILL POINTER = EMPTY POINTER?
  80.     BNE.S    CHIN010        ;BRANCH IF NOT
  81.     BSR.S    FILLBUF        ;GET A LINE OF CHARACTERS FROM KEYBOARD
  82. CHIN010    CLR.L    D0
  83.     MOVE.B    (A1)+,D0    ;GET CHARACTER AT EMPTY POINTER
  84.  
  85.     MOVE.L    A0,LINPTRF    ;SAVE THE POINTERS
  86.     MOVE.L    A1,LINPTRE
  87.     MOVEM.L    (SP)+,A0/A1    ;RESTORE REGISTERS
  88.     RTS
  89.  
  90. ;----------------------------------------------------------------------
  91. ;GET A LINE OF CHARACTERS FROM THE KEYBOARD AND PUT THEM INTO "LINBUF".
  92. ; REGISTERS D0, A0, AND A1 ARE DESTROYED.
  93. ;
  94. FILLBUF    MOVEA.L    #LINBUF,A0    ;RESET THE POINTERS TO THE START OF
  95.     MOVEA.L    A0,A1        ; THE LINE BUFFER
  96.  
  97. FB00    BSR    GETKEYX        ;GET CHARACTER FROM KEYBOARD
  98.                 ; (CHECK CTRL-C, ETC.)
  99.     CMPI.B    #DEL,D0        ;IS IT A DELETE CHARACTER?
  100.     BEQ.S    FB05        ;BRANCH IF IT IS
  101.     CMPI.B    #BS,D0        ;IS IT A BACKSPACE (BACK ARROW)?
  102.     BNE.S    FB10        ;BRANCH IF NOT
  103. FB05    CMPA.L    #LINBUF,A0    ;ARE WE AT THE BEGINNING OF THE BUFFER?
  104.     BEQ.S    FB00        ;BRANCH IF SO (DON'T DELETE ANYTHING)
  105.     SUBQ.L    #1,A0        ;BACK UP 1 CHARACTER IN THE LINE BUFFER
  106.     MOVEQ    #BS,D0        ;DELETE THE CHARACTER ON THE SCREEN
  107.     BSR    CHOUT1        ;BACK UP
  108.     MOVEQ    #SPACE,D0    ;SPACE IT OUT
  109.     BSR    CHOUT1
  110.     MOVEQ    #BS,D0        ;BACK UP
  111.     BSR    CHOUT1
  112.     BRA    FB00        ;GO GET NEXT KEYSTROKE
  113.  
  114. FB10    CMPI.B    #FWDSP,D0    ;FORWARD (RIGHT) ARROW?
  115.     BNE.S    FB20        ;BRANCH IF NOT
  116.     CMPI.B    #CR,(A0)    ;ARE WE AT THE END OF THE INPUT LINE?
  117.     BEQ.S    FB00        ;BRANCH IF WE ARE (IGNORE IT)
  118.     CMPA.L    #LINBUFE,A0    ;ARE WE BEYOND THE END OF THE BUFFER?
  119.     BHS.S    FB00        ;BRANCH IF WE ARE (IGNORE IT)
  120.     MOVE.B    (A0)+,D0    ;ECHO CHAR TO MOVE FORWARD ON SCREEN
  121.     BSR    CHOUT1
  122.     BRA.S    FB00        ;GO GET NEXT KEYSTROKE
  123.  
  124. FB20    CMPI.B    #'X'-CTRL,D0    ;CTRL-X (LINE DELETE)?
  125.     BNE.S    FB30        ;BRANCH IF NOT
  126.     BSR    DELLINE        ;DELETE THE LINE
  127.     BRA.S    FB00
  128.  
  129. FB30    CMPI.B    #'Z'-CTRL,D0    ;CTRL-Z (REGURGE PREVIOUS LINE BUFFER)?
  130.     BNE.S    FB50        ;BRANCH IF NOT
  131.     BSR    DELLINE        ;DELETE ANYTHING ON THE LINE & RESET A0
  132. FB35    MOVE.B    (A0),D0        ;GET CHARACTER FROM PREVIOUS BUFFER
  133.     CMPI.B    #CR,D0        ;IS IT A CARRIAGE RETURN?
  134.     BEQ.S    FB00        ;BRANCH IF YES, WE'RE DONE
  135.     BSR    CHOUT1        ;ECHO THIS CHARACTER
  136.     CMPA.L    #LINBUFE,A0    ;ARE WE BEYOND THE END OF THE BUFFER?
  137.     BHS.S    FB00        ;BRANCH IF YES, WE'RE DONE
  138.     ADDQ.L    #1,A0        ;INCREMENT FILL POINTER
  139.     BRA.S    FB35        ;LOOP UNTIL DONE
  140.  
  141. ;THE LAST CHARACTER IN THE LINE BUFFER MAY BE A <CR> BUT ANYTHING ELSE
  142. ; IS AN ERROR.
  143. FB50    MOVE.B    D0,(A0)+    ;ALWAYS STORE THE CHARACTER
  144.     CMPI.B    #CR,D0        ;WAS IT A CARRIAGE RETURN?
  145.     BEQ.S    FB90        ;EXIT IF IT WAS
  146.     CMPA.L    #LINBUFE-1,A0    ;IS THE BUFFER FULL? (LEAVE ROOM FOR CR)
  147.     BLO.S    FB85        ;BRANCH IF IT IS NOT - GO ECHO CHAR
  148. FB80    SUBQ.L    #1,A0        ;MOVE FILL POINTER BACK
  149.     MOVEQ    #BEL,D0        ;BUFFER IS FULL SO JUST BEEP
  150. FB85    BSR    CHOUT1
  151.     BRA    FB00        ;LOOP UNTIL CARRIAGE RETURN
  152.  
  153. FB90    BSR    CHOUT1        ;ECHO THE CARRIAGE RETURN
  154.     RTS
  155.  
  156. ;----------------------------------------------------------------------
  157. ;DELETE THE LINE BUFFER.
  158. ; THIS DELETES IT FROM THE SCREEN AND RESETS THE FILL POINTER (A0) TO
  159. ; THE BEGINNING OF THE BUFFER.
  160. ; REGISTER D0 IS DESTROYED.
  161. ;
  162. DELLINE    CMPA.L    #LINBUF,A0    ;ARE WE AT THE BEGINNING OF THE BUFFER?
  163.     BEQ.S    DELL90        ;BRANCH IF WE ARE - WE'RE ALL DONE
  164.     SUBQ.L    #1,A0        ;BACKUP ONE CHARACTER IN THE LINE BUFFER
  165.     MOVEQ    #BS,D0        ;DELETE THE CHARACTER ON THE SCREEN:
  166.     BSR    CHOUT1        ; BACK UP
  167.     MOVEQ    #SPACE,D0    ; SPACE IT OUT
  168.     BSR    CHOUT1
  169.     MOVEQ    #BS,D0        ; BACK UP
  170.     BSR    CHOUT1
  171.     BRA.S    DELLINE        ;LOOP FOR ALL CHARACTERS
  172.  
  173. DELL90    RTS
  174.  
  175. ;----------------------------------------------------------------------
  176. ;OUTPUT CHARACTER IN D0 TO THE TERMINAL
  177. ;
  178. CHOUT0    BRA    CHOUT1        ;(PBRA) SAME AS FOR DEVICE # 1
  179.  
  180. ;----------------------------------------------------------------------
  181. ;CLOSE THE TERMINAL
  182. ;
  183. CLOSE0    BRA    CLOSE1        ;(PBRA) SAME AS FOR DEVICE # 1
  184.  
  185. ;======================================================================
  186. ;UNBUFFERED CONSOLE HANDLER (DEVICE #1)
  187. ;
  188. CONHAN1    DC.L    OPENI1        ;0 = OPENI
  189.     DC.L    OPENO1        ;1 = OPENO
  190.     DC.L    CHIN1        ;2 = CHIN
  191.     DC.L    CHOUT1        ;3 = CHOUT
  192.     DC.L    CLOSE1        ;4 = CLOSE
  193.     DC.L    GETINFO        ;5 = GET INFO
  194.     DC.L    DUMMY        ;6 = SPARE
  195.     DC.L    CURSOR1        ;7 = POSITION CURSOR
  196.     DC.L    CHKUSR        ;8 = CHECK FOR CTRL-C, CTRL-S, CTRL-P
  197.     DC.L    GETKEYZ        ;9 = WAIT FOR AND RETURN A KEY'S VALUE
  198.     DC.L    KEYHIT        ;10 = D0 = 'TRUE' IF KEY WAS HIT
  199.     DC.L    SHOCUR        ;11 = TURNS THE CURSOR ON/OFF
  200.     DC.L    BUTES        ;12 = SET DISPLAY ATTRIBUTES
  201.  
  202. ;----------------------------------------------------------------------
  203. ;OPEN (INITIALIZE) KEYBOARD FOR INPUT.
  204. ; THIS WILL DISCARD ANY PENDING CHARACTERS FROM THE TERMINAL
  205. ;
  206. OPENI1    BSR    OPEN
  207.     MOVE.L    D0,-(SP)    ;SAVE D0
  208.     MOVE.B    DEVICE,-(SP)    ;SAVE DEVICE NUMBER
  209.  
  210.     CLR.B    DEVICE        ;CURSOR SHOULD ONLY APPEAR ON DEVICE 0
  211.     MOVEQ    #FALSE,D0    ;TURN OFF THE CURSOR FLASHER
  212.     BSR    SHOCUR
  213.  
  214. OPI105    BSR    KEYHIT        ;IS A KEY PRESSED?
  215.     BEQ.S    OPI110        ;BRANCH IF NOT
  216.     BSR    GETKEYX        ;IF SO, EAT IT (CHECK FOR CTRL-C, ETC)
  217.     BRA.S    OPI105        ;LOOP UNITL ALL CHARACTERS ARE FLUSHED
  218.  
  219. OPI110    MOVE.B    (SP)+,DEVICE    ;RESTORE DEVICE NUMBER
  220.     MOVE.L    (SP)+,D0    ;RESTORE D0
  221. DUMMY    RTS
  222.  
  223. ;----------------------------------------------------------------------
  224. ;OPEN (INITIALIZE) TERMINAL SCREEN FOR OUTPUT.
  225. ;
  226. OPENO1    MOVE.L    D0,-(SP)    ;SAVE D0
  227.  
  228.     BSR    OPEN
  229.     MOVEQ    #FALSE,D0    ;TURN OFF THE CURSOR FLASHER
  230.     BSR    SHOCUR
  231.     BSR    CRLF1
  232.  
  233.     MOVE.L    (SP)+,D0    ;RESTORE D0
  234.     RTS
  235.  
  236. ;----------------------------------------------------------------------
  237. ;GET A CHARACTER FROM THE KEYBOARD, ECHO IT, AND RETURN IT IN D0.
  238. ;
  239. CHIN1    MOVE.B    DEVICE,-(SP)    ;SAVE DEVICE NUMBER
  240.     CLR.B    DEVICE        ;ECHO ON THE FIRST TERMINAL
  241.     BSR    GETKEYX        ;GET THE CHAR (CHECK FOR CTRL-C, ETC.)
  242.     BSR.S    CHOUT1        ;ECHO IT
  243.     MOVE.B    (SP)+,DEVICE    ;RESTORE DEVICE NUMBER
  244.     RTS
  245.  
  246. ;----------------------------------------------------------------------
  247. ;OUTPUT THE CHARACTER IN D0 TO THE SELECTED TERMINAL (DEVICE # 0 OR 1).
  248. ; HANDLE SOME SPECIAL CHARACTERS: NUL, TAB, CR, & FF.
  249. ;
  250. CHOUT1    CMPI.B    #$20,D0
  251.     BHS.S    CHO170
  252.  
  253.     CMPI.B    #NUL,D0        ;IS IT A NULL CHARACTER?
  254.     BNE.S    CHO110        ;BRANCH IF NOT
  255.     RTS            ;IGNORE NULLS
  256.  
  257. CHO110    CMPI.B    #TAB,D0        ;IS IT A TAB CHARACTER?
  258.     BNE.S    CHO120        ;BRANCH IF NOT
  259.     BRA    DOTAB        ;(PBRA) DO TAB AND RETURN
  260.  
  261. CHO120    CMPI.B    #CR,D0        ;IS IT A CARRIAGE RETURN?
  262.     BNE.S    CHO130        ;BRANCH IF NOT
  263.     BRA    CRLF1        ;(PBRA) START A NEW LINE
  264.  
  265. CHO130    CMPI.B    #FF,D0        ;IS IT A FORM FEED?
  266.     BNE.S    CHO150        ;BRANCH IF NOT
  267.     BRA    HOMER        ;(PBRA) DO HOME ERASE AND RETURN
  268.  
  269. CHO150    CMPI.B    #LF,D0        ;IS IT A LINE FEED?
  270.     BNE.S    CHO155        ;BRANCH IF NOT
  271.     RTS            ;IGNORE IT (THESE ARE STILL A PROBLEM)
  272.  
  273. CHO155    CMPI.B    #'Z'-CTRL,D0    ;IS IT A CTRL-Z?
  274.     BNE.S    CHO160        ;BRANCH IF NOT
  275.     MOVEQ    #'#',D0        ;CHANGE IT TO A POUND SIGN BECAUSE
  276.     BRA.S    CHO170        ; A CTRL-Z WILL BLANK THE SCREEN
  277.  
  278. CHO160    CMPI.B    #BS,D0        ;IS IT A BACKSPACE?
  279.     BNE.S    CHO170        ;BRANCH IF NOT
  280.     MOVE.L    A6,-(SP)    ;SAVE A6
  281.     MOVEA.W    DEVICE-1,A6    ;DEVICE NUMBER IS AN INDEX
  282.     SUBQ.B    #1,CURSORX(A6)    ;DECREMENT X POSITION FOR CURRENT DEVICE
  283.     MOVEA.L    (SP)+,A6    ;RESTORE A6
  284.     BRA    BYTEOUT        ;(PBRA) OUTPUT THE CHARACTER AND RETURN
  285.  
  286. CHO170    MOVE.L    A6,-(SP)    ;SAVE A6
  287.     MOVEA.W    DEVICE-1,A6    ;DEVICE NUMBER IS AN INDEX
  288.     ADDQ.B    #1,CURSORX(A6)    ;BUMP X POSITION FOR CURRENT DEVICE
  289.     MOVEA.L    (SP)+,A6    ;RESTORE A6
  290.     BRA    BYTEOUT        ;(PBRA) OUTPUT THE CHARACTER AND RETURN
  291.  
  292. ;----------------------------------------------------------------------
  293. ;CLOSE THE TERMINAL (NOTHING REQUIRED)
  294. ;
  295. CLOSE1    RTS
  296.  
  297. ;----------------------------------------------------------------------
  298. ;RETURN THE ADDRESS OF THE INFORMATION ARRAY IN D0
  299. ;
  300. GETINFO    MOVE.L    #INFO,D0
  301.     RTS
  302.  
  303. INFO    DC.L    START        ;STARTING AND ENDING ADDRESSES OF
  304.     DC.L    END        ; THIS HANDLER
  305.     DC.L    INFOSTR        ;DESCRIPTION
  306.     DC.L    80        ;COLUMNS
  307.     DC.L    24        ;LINES
  308. INFOSTR    ASCII    'QUMEHANA  FEB-16-87  Qume QVT-101 terminal, 9600 bau'
  309.     DC.B    'd' + $80
  310.  
  311. ;----------------------------------------------------------------------
  312. ;POSITION THE CURSOR TO X,Y FOR THE CURRENT DEVICE (0 OR 1)
  313. ; X = COLUMN =    HIGH BYTE OF D0
  314. ; Y = LINE =    LOW BYTE OF D0
  315. ;
  316. CURSOR1    MOVEM.L    D0/A6,-(SP)    ;SAVE REGISTERS
  317.     MOVEA.W    DEVICE-1,A6    ;DEVICE NUMBER IS AN INDEX
  318.  
  319.     CMPI.B    #24,D0        ;UNPACK X AND Y COORDINATES
  320.     BLO.S    CUR10        ;HANDLE OUT OF RANGE VALUES
  321.     MOVE.B    #23,D0        ;MAX LINE = 23
  322. CUR10    MOVE.B    D0,CURSORY(A6)    ;GET LINE NUMBER (DON'T USE MOVEQ)
  323.     LSR.W    #8,D0        ;GET X COORDINATE
  324.     CMPI.B    #80,D0        ;OUT OF RANGE?
  325.     BLO.S    CUR20        ;BRANCH IF NOT
  326.     MOVE.B    #79,D0        ;SET MAXIMUM X VALUE
  327. CUR20    MOVE.B    D0,CURSORX(A6)
  328.     MOVEQ    #ESC,D0        ;SEND COMMAND TO WYSE (LINE, COLUMN):
  329.     BSR    BYTEOUT        ; <ESC> = (Y+$20) (X+$20)
  330.     MOVEQ    #'=',D0
  331.     BSR    BYTEOUT
  332.     MOVEQ    #$20,D0
  333.     ADD.B    CURSORY(A6),D0
  334.     BSR    BYTEOUT
  335.     MOVEQ    #$20,D0
  336.     ADD.B    CURSORX(A6),D0
  337.     BSR    BYTEOUT
  338.  
  339.     MOVEM.L    (SP)+,D0/A6    ;RESTORE REGISTERS
  340.     RTS
  341.  
  342. ;----------------------------------------------------------------------
  343. ;CHECK FOR AND HANDLE CTRL-S, CTRL-P, AND CTRL-C
  344. ;
  345. CHKUSR    BSR    KEYHIT        ;WAS A KEY PRESSED?
  346.     BEQ.S    CU90        ;BRANCH IF NOT (EXIT)
  347. ;SAMPLE KEYSTROKE SUCH THAT IT MAY BE RE-READ LATER    ????
  348.     ANDI.B    #$7F,D0        ;MAKE SURE MSB IS CLEAR
  349.     CMPI.B    #'C'-CTRL,D0    ;EXIT PROGRAM IF IT'S A CTRL-C
  350.     BEQ.S    XVEXIT
  351.     CMPI.B    #'P'-CTRL,D0    ;ABORT IF IT'S A CTRL-P
  352.     BEQ.S    XVABORT
  353. CU90    RTS
  354.  
  355. XVEXIT    JMP    VEXIT
  356. XVABORT    JMP    VABORT
  357.  
  358. ;----------------------------------------------------------------------
  359. ;GET A CHARACTER FROM THE KEYBOARD (OR COMMAND FILE) AND RETURN IT IN D0
  360. ; CHECK FOR CTRL-C, ETC. "DEVICE" MUST BE 0.
  361. ;
  362. GETKEYX    MOVEQ    #TRUE,D0    ;TURN ON THE CURSOR FLASHER
  363.     BSR    SHOCUR
  364.  
  365.     BSR    GETKEYZ        ;GET THE CHARACTER (FROM THE KEYBOARD
  366.                 ; OR FROM A .CMD FILE)
  367.     MOVE.L    D0,-(SP)
  368.     MOVEQ    #FALSE,D0    ;TURN OFF THE CURSOR FLASHER
  369.     BSR    SHOCUR
  370.     MOVE.L    (SP)+,D0
  371.  
  372.     CMPI.B    #'C'-CTRL,D0    ;EXIT PROGRAM IF IT'S A CTRL-C
  373.     BEQ.S    XVEXIT
  374.     CMPI.B    #'P'-CTRL,D0    ;ABORT IF IT'S A CTRL-P
  375.     BEQ.S    XVABORT
  376.     RTS
  377.  
  378. ;----------------------------------------------------------------------
  379. ;GET A CHARACTER FROM THE KEYBOARD OR COMMAND FILE AND RETURN IT IN D0.
  380. ; COMMAND (.CMD) FILES ARE INITIATED BY APEX.XPL (DOCMD), WHICH FILLS
  381. ; THE COMMAND BUFFER (CMDBUF) WITH THE CHARACTERS AND SETS THE "CMDMOD" 
  382. ; FLAG. THE COMMAND BUFFER PHYSICALLY OCCUPIES THE SAME SPACE AS THE
  383. ; KEYBOARD BUFFER, BUT THEY ARE LOGICALLY TWO SEPARATE BUFFERS.
  384. ;
  385. GETKEYZ    TST.B    CMDMOD        ;ARE WE IN COMMAND MODE?
  386.     BEQ.S    GKZ20        ;BRANCH IF NOT
  387.  
  388.     MOVE.L    A6,-(SP)    ;GET CHARACTER FROM COMMAND BUFFER
  389.     MOVEA.L    CMDPTR,A6    ; AT "CMDPTR"
  390.     MOVEQ    #0,D0
  391.     MOVE.B    (A6)+,D0    ;BUMP POINTER AND SAVE IT
  392.     MOVE.L    A6,CMDPTR
  393.     MOVEA.L    (SP)+,A6
  394.     CMPI.B    #EOF,D0        ;IS THIS THE END OF THE COMMAND FILE?
  395.     BNE.S    GKZ90        ;BRANCH IF NOT -- EXIT WITH CHAR IN D0
  396.     MOVE.B    FALSE,CMDMOD    ;TURN OFF COMMAND MODE
  397.  
  398. GKZ20    BSR    BYTEIN        ;GET THE CHARACTER FROM KEYBOARD
  399. GKZ90    RTS
  400.  
  401. ;----------------------------------------------------------------------
  402. ;SPACE OVER TO NEXT TAB STOP
  403. ;
  404. DOTAB    MOVEM.L    D0/A6,-(SP)    ;SAVE REGISTERS
  405.     MOVEA.W    DEVICE-1,A6    ;DEVICE NUMBER IS AN INDEX
  406.  
  407. DOTAB10    MOVEQ    #SPACE,D0    ;OUTPUT A SPACE CHARACTER
  408.     BSR    BYTEOUT
  409.     ADDQ.B    #1,CURSORX(A6)    ;BUMP X POSITION
  410.     MOVE.B    CURSORX(A6),D0    ;ARE WE AT THE NEXT TAB STOP?
  411.     ANDI.B    #$07,D0
  412.     BNE.S    DOTAB10        ;BRANCH IF NOT
  413.  
  414.     MOVEM.L    (SP)+,D0/A6    ;RESTORE REGISTERS
  415.     RTS
  416.  
  417. ;----------------------------------------------------------------------
  418. ;CLEAR SCREEN AND HOME TO UPPER LEFT CORNER
  419. ;
  420. HOMER    MOVEM.L    D0/A6,-(SP)    ;SAVE REGISTERS
  421.     MOVEA.W    DEVICE-1,A6    ;DEVICE NUMBER IS AN INDEX
  422.  
  423.     MOVEQ    #'Z'-CTRL,D0    ;THE WYSE USES CTRL-Z TO DO A CTRL-L
  424.     BSR    BYTEOUT
  425.     CLR.B    CURSORX(A6)    ;RESET POSITION TO 0,0
  426.     CLR.B    CURSORY(A6)
  427.  
  428.     MOVEM.L    (SP)+,D0/A6    ;RESTORE REGISTERS
  429.     RTS
  430.  
  431. ;----------------------------------------------------------------------
  432. ;START A NEW LINE ON THE TERMINAL
  433. ;
  434. CRLF1    MOVEM.L    D0/A6,-(SP)    ;SAVE REGISTERS
  435.     MOVEA.W    DEVICE-1,A6    ;DEVICE NUMBER IS AN INDEX
  436.  
  437.     MOVEQ    #CR,D0        ;OUTPUT A CARRIAGE RETURN
  438.     BSR    BYTEOUT
  439.     CLR.B    CURSORX(A6)    ;RESET X POSITION TO 0
  440.     MOVEQ    #LF,D0        ;OUTPUT A LINE FEED
  441.     BSR    BYTEOUT
  442.     MOVE.B    CURSORY(A6),D0    ;ARE WE ON THE BOTTOM LINE?
  443.     CMPI.B    #23,D0
  444.     BHS.S    CRLF110        ;BRANCH IF WE ARE (WE SCROLL)
  445.     ADDQ.B    #1,CURSORY(A6)    ;ELSE, MOVE DOWN A LINE
  446.  
  447. CRLF110    MOVEM.L    (SP)+,D0/A6    ;RESTORE REGISTERS
  448.     RTS
  449.  
  450. ;----------------------------------------------------------------------
  451. ;ROUTINE TURN THE CURSOR INDICATOR ON OR OFF FOR THE CURRENT DEVICE.
  452. ; IF D0 # 0 (TRUE), THE CURSOR IS TURNED ON
  453. ;
  454. SHOCUR    MOVE.L    D0,-(SP)    ;SAVE D0
  455.  
  456.     MOVEQ    #ESC,D0        ;SEND <ESC>"."
  457.     BSR    BYTEOUT
  458.     MOVEQ    #".",D0
  459.     BSR    BYTEOUT
  460.  
  461.     MOVEQ    #'0',D0        ;ASSUME IT IS OFF
  462.     TST.L    (SP)        ;CHECK FLAG
  463.     BEQ.S    SHC10        ;BRANCH IF OFF
  464.     MOVEQ    #'1',D0        ;TURN IT ON
  465. SHC10    BSR    BYTEOUT
  466.  
  467.     MOVE.L    (SP)+,D0    ;RESTORE D0
  468.     RTS
  469.  
  470. ;----------------------------------------------------------------------
  471. ;SET THE DISPLAY ATTRIBUTES FOR THE CURRENT DEVICE ACCORDING TO D0.
  472. ; D0 CONTAINS A 4-BIT ARRAY
  473. ; (THE TERMINAL SHOULD BE SET UP SO THAT ATTRIBUTES ARE ACTIVE TO THE
  474. ; END OF THE PAGE.)
  475. ;WARNING: THIS DOESN'T WORK VERY WELL BECAUSE THE BRAIN-DAMAGED TERMINAL
  476. ; INSERTS A SPACE CHARACTER WHENEVER CHANGING THE DISPLAY ATTRIBUTE.
  477. ;
  478. BUTES    MOVE.L    D0,-(SP)    ;SAVE D0
  479.  
  480.     MOVEQ    #ESC,D0        ;SEND <ESC>"G"
  481.     BSR    BYTEOUT
  482.     MOVEQ    #'G',D0
  483.     BSR    BYTEOUT
  484.  
  485.     MOVE.L    (SP),D0        ;GET ARGUMENT
  486.     MOVE.B    BUTETBL-@-2(PC,D0),D0 ;GET ATTRIBUTE CODE FROM TABLE
  487.     BSR    BYTEOUT        ;SEND IT
  488.  
  489.     MOVE.L    (SP)+,D0    ;RESTORE D0
  490.     RTS
  491.  
  492. ;TABLE OF ATTRIBUTE CODES:
  493. ; D = DIM (NOT BOLD), U = UNDERLINE, I = INVERSE VIDEO, F = FLASHING
  494. BUTETBL    DC.B    $70        ;- - - D
  495.     DC.B    $30        ;- - - -
  496.     DC.B    $78        ;- - U D
  497.     DC.B    $38        ;- - U -
  498.     DC.B    $74        ;- I - D
  499.     DC.B    $34        ;- I - -
  500.     DC.B    $7C        ;- I U D    :-)
  501.     DC.B    $3C        ;- I U -
  502.     DC.B    $72        ;F - - D
  503.     DC.B    $32        ;F - - -
  504.     DC.B    $7A        ;F - U D
  505.     DC.B    $3A        ;F - U -
  506.     DC.B    $76        ;F I - D
  507.     DC.B    $36        ;F I - -
  508.     DC.B    $7E        ;F I U D
  509.     DC.B    $3E        ;F I U -
  510.  
  511. ;======================================================================
  512. ;LOWEST LEVEL I/O ROUTINES:
  513. ;
  514. SERDATR    EQU    $DFF018        ;Serial port data and status register
  515. SERDAT    EQU    $DFF030        ;Serial port data register (write)
  516. SERPER    EQU    $DFF032        ;Serial port period and control register
  517. INTREQ    EQU    $DFF09C        ;Interrupt request (status) bits
  518.  
  519. ;----------------------------------------------------------------------
  520. ;Routine to initialize RS-232 I/O.
  521. ;
  522. OPEN    MOVE.W    #$0174,SERPER.L    ;Set 8 bits, 9600 baud
  523.     MOVE.W    #$0800,INTREQ.L    ;Clear "receive buffer full" status bit
  524.     RTS
  525.  
  526. ;----------------------------------------------------------------------
  527. ;Routine to wait for then return the value of a byte in D0.
  528. ;
  529. BYTEIN    MOVE.W    SERDATR.L,D0    ;Read status and data
  530.     ADDQ.L    #1,HASH        ;Spin the randomizer while we wait
  531.     BTST    #14,D0        ;Receive buffer full
  532.     BEQ.S    BYTEIN        ;Loop if not
  533.     MOVE.W    #$0800,INTREQ.L    ;Clear "receive buffer full" status bit
  534.         
  535.     ANDI.L    #$000000FF,D0    ;Return byte in D0
  536.     RTS
  537.  
  538. ;----------------------------------------------------------------------
  539. ;Routine to output the byte in D0 to an RS-232 port.
  540. ;
  541. BYTEOUT    MOVEM.W    D0-D1,-(SP)    ;Save low word of registers
  542.  
  543. BYO10    MOVE.W    SERDATR.L,D1    ;Get serial port status
  544.     BTST    #13,D1        ;Test transmitter buffer empty
  545.     BEQ.S    BYO10        ;Branch if it is not empty
  546.     ANDI.W    #$00FF,D0    ;Add start and stop bits to the
  547.     ORI.W    #$0100,D0    ; data byte
  548.     MOVE.W    D0,SERDAT.L    ;Output data
  549.  
  550.     MOVEM.W    (SP)+,D0-D1    ;Restore registers
  551.     RTS
  552.  
  553. ;----------------------------------------------------------------------
  554. ;Routine to check if a key was struck. This returns with "NE" status if
  555. ; it was struck. A boolean is also returned in D0 since this may be
  556. ; called by an intrinsic.
  557. ;
  558. KEYHIT    MOVE.W    SERDATR.L,D0    ;Read status and data
  559.     BTST    #14,D0        ;Receive buffer full
  560.     SNE    D0
  561.     EXT.W    D0
  562.     EXT.L    D0
  563.     RTS
  564.  
  565. END    EQU    @        ;ADDRESS WHERE THIS HANDLER ENDS +1
  566.     IF    END > START +$600
  567.     ERROR -- FILE IS TOO LONG
  568.     ENDIF
  569.  
  570. ;----------------------------------------------------------------------
  571. ;HOOK THESE HANDLERS INTO THE DEVICE HANDLER TABLE AS DEVICES 0 AND 1
  572. ;
  573.     ORG    DEVTBL
  574.     DC.L    CONHAN0
  575.     DC.L    CONHAN1
  576.  
  577.     END
  578. 
  579. ;HOOK THESE H